#pragma once
#define BLOCK_NUM 10
#define BLOCK_SIZE 1000
#include <sys/types.h>
#include <sys/stat.h>
#include<iostream>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<unistd.h>
#include <sys/types.h> // key_t, pid_t 等类型定义（所有IPC的基础）
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <stdio.h>  // perror() 错误打印
#include <stdlib.h> // exit(), NULL
#include <string.h> // memcpy(), strerror()
#include <errno.h>
#include"sem.h"
#include<mutex>
using namespace std;

class SharedMemoryIPC
{
public:
    enum  Mode { READER, WRITER };
      // 获取读单例
    static SharedMemoryIPC& getReaderInstance(key_t msg_key=1001,key_t shm_key=2001,key_t sem_key=3001);
    // 获取写单例 
    static SharedMemoryIPC& getWriterInstance(key_t msg_key=1001,key_t shm_key=2001,key_t sem_key=3001);
    void init_ipc();
    int write_shm(char*data);
    void read_shm(char*data);


private:
 // 操作模式
    SharedMemoryIPC(Mode  mode,int msg_key=1001,int shm_key=2001,int sem_key=3001);
    ~SharedMemoryIPC();



    static SharedMemoryIPC* readerInstance;
    static SharedMemoryIPC* writerInstance;
    static std::mutex readerMutex;
    static std::mutex writerMutex;

private:

    Mode current_mode;

    typedef struct
    {
        long mtype;
        char mtext[100];
    } MSG;
    int shmid = 0; // 共享内存
    int msgid = 0; // 消息队列
    int semid = 0; // 信号量
    MSG msg;
    int arr[BLOCK_NUM] = {0};
    char *data;


    key_t msg_key_;
    key_t shm_key_;
    key_t sem_key_;


    mutex mutex_;
    
    Sem sem;
};